package algoritmo.cruzamiento;

import poblacion.Cromosoma;

public class CruzadorMascaraDoble extends Cruzador{

	@Override
	protected void cruzar(Cromosoma c1, Cromosoma c2) {
		
		String cod1Modificado = this.aplicarMascaraUno(c1);
		String cod2Modificado = this.aplicarMascaraDos(c2);
		
		c1.SetCodificacionBinaria(cod1Modificado);
		c2.SetCodificacionBinaria(cod2Modificado);
		
	}

	private String aplicarMascaraDos(Cromosoma c2) {
		
		StringBuilder sb = new StringBuilder();
		
		sb.append(c2.getCodificacionBinaria());
		
		char[] codificacion = c2.getCodificacionBinaria().toCharArray();
		sb.replace(0,1, this.invertir(codificacion[0]));
		sb.replace(1,2, this.invertir(codificacion[1]));
		sb.replace(2,3, this.invertir(codificacion[2]));
		sb.replace(3,4, this.invertir(codificacion[3]));
		sb.replace(4,5, this.invertir(codificacion[4]));
		
		sb.replace(20,21, this.invertir(codificacion[20]));
		sb.replace(21,22, this.invertir(codificacion[21]));
		sb.replace(22,23, this.invertir(codificacion[22]));
		sb.replace(23,24, this.invertir(codificacion[23]));
		sb.replace(24,25, this.invertir(codificacion[24]));
		
		sb.replace(50,51, this.invertir(codificacion[50]));
		sb.replace(51,52, this.invertir(codificacion[51]));
		sb.replace(52,53, this.invertir(codificacion[52]));
		sb.replace(53,54, this.invertir(codificacion[53]));
		sb.replace(54,55, this.invertir(codificacion[54]));
		
		return sb.toString();
	}

	private String invertir(char c) {
		if (Character.valueOf(c).equals(Character.valueOf('1'))){
			return String.valueOf('0');
		}else
			return String.valueOf('1');
	}

	private String aplicarMascaraUno(Cromosoma c1) {
		
		StringBuilder sb = new StringBuilder();
		
		sb.append(c1.getCodificacionBinaria());
		
		char[] codificacion = c1.getCodificacionBinaria().toCharArray();
	
		sb.replace(15,16, this.invertir(codificacion[15]));
		sb.replace(16,17, this.invertir(codificacion[16]));
		sb.replace(17,18, this.invertir(codificacion[17]));
		sb.replace(18,19, this.invertir(codificacion[18]));
		sb.replace(19,20, this.invertir(codificacion[19]));
		
		sb.replace(30,31, this.invertir(codificacion[30]));
		sb.replace(31,32, this.invertir(codificacion[31]));
		
		sb.replace(45,46, this.invertir(codificacion[45]));
		sb.replace(46,47, this.invertir(codificacion[46]));
		sb.replace(47,48, this.invertir(codificacion[47]));
		
		sb.replace(60,61, this.invertir(codificacion[60]));
		sb.replace(61,62, this.invertir(codificacion[61]));

		return sb.toString();
	
	}

}
